package src.com.zuiacsn;

import src.com.test.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.function.Consumer;

/*
* 获取类的构造器
* */
public class Demo2 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
/*
Constructor<?>[] getConstructors() 获取全部构造器(只能获取public修饰的)
Constructor<?>[] getDeclaredConstructors()获取全部构造器(只要存在就能拿到)
Constructor<T> getConstructor(class<?>... parameterTypes) 获取某个构造器(只能获取public修饰的)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取某个构造器（只要存在就能拿到)
* */
        // 1.获取类的字节码文件对象
        Class<Student> studentClass = Student.class;

        // 2.获取构造器
        Constructor<?>[] constructors = studentClass.getConstructors();
        Arrays.stream(constructors).forEach(new Consumer<Constructor<?>>() {
            @Override
            public void accept(Constructor<?> constructor) {
                System.out.println(constructor);
            }
        });

        /*
        * 获取类的构造器的作用:实例化一个对象并返回
        *
        * T newInstance(Object....args) 调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
        * public void setAccessible(Boolean flag) 设置为true,表示禁止检查访问控制(暴力反射)
        * */

        Constructor constructor = studentClass.getDeclaredConstructor();
        constructor.setAccessible(true);// 禁止检查访问控制
        Student stu2 = (Student)constructor.newInstance();
        System.out.println(stu2);


    }
}
